import pandas as pd  # 导入pandas库用于数据处理和分析
import matplotlib.pyplot as plt  # 导入matplotlib.pyplot模块用于绘图
from matplotlib.font_manager import FontProperties  # 导入FontProperties用于设置字体

# 设置中文字体，确保中文显示正常
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为黑体，支持中文显示
plt.rcParams['axes.unicode_minus'] = False  # 解决坐标轴负号显示问题

# 读取Excel文件
file_path = 'jobs.xlsx'  # 定义Excel文件的路径
df = pd.read_excel(file_path)  # 使用pandas读取Excel文件，返回一个DataFrame对象

# 筛选Python工程师相关的职位
python_dev_jobs = df[df['jobName'].str.contains('Python工程师', case=False)]
# 通过布尔索引筛选出jobName列中包含“python工程师”的行，case=False表示忽略大小写

# 提取技能信息
skills = python_dev_jobs['skills'].dropna().tolist()
# 从筛选后的DataFrame中提取skills列，dropna()去除缺失值，tolist()转换为列表

# 统计技能出现的次数
skill_counts = {}  # 初始化一个空字典用于存储技能及其出现次数
for skills_list in skills:  # 遍历每个职位的技能列表
    for skill in skills_list.split(','):  # 将技能字符串按逗号分割成单独的技能
        skill = skill.strip()  # 去除技能字符串两端的空白字符
        if skill:  # 如果技能字符串非空
            if skill in skill_counts:  # 如果技能已在字典中
                skill_counts[skill] += 1  # 出现次数加1
            else:  # 如果技能不在字典中
                skill_counts[skill] = 1  # 在字典中添加该技能，出现次数设为1

# 按出现次数排序并选择前10项
sorted_skills = sorted(skill_counts.items(), key=lambda x: x[1], reverse=True)
# 将字典转换为列表并按值（出现次数）降序排序
top_skills = sorted_skills[:10]  # 选择出现次数最多的前10个技能

# 准备饼状图数据
labels = [skill[0] for skill in top_skills]  # 提取前10个技能的名称作为饼图标签
sizes = [skill[1] for skill in top_skills]  # 提取前10个技能的出现次数作为饼图数据
colors = plt.cm.tab20.colors  # 从matplotlib的colormap中选择颜色，用于饼图的不同部分

# 创建饼状图
plt.figure(figsize=(10, 8))  # 设置图形的大小为10x8英寸
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=140)
# 绘制饼图，autopct设置百分比显示格式，startangle设置饼图起始角度
plt.axis('equal')  # 设置坐标轴为相等比例，使饼图为正圆

# 添加标题
plt.title('Python工程师岗位需求技能分布情况', fontsize=16)  # 设置图形标题为“Python工程师技能分布”，字体大小为16

# 保存饼状图
plt.savefig('python_skills_pie_chart.png')  # 将饼图保存为PNG文件，文件名为“python_skills_pie_chart.png”

# 显示饼状图
plt.show()  # 在屏幕上显示饼图